package com.heima.user.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import com.heima.utils.common.MD5Utils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class ApUserServiceImpl
        extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {


    @Autowired
    private ApUserMapper apUserMapper;

    @Override
    public ResponseResult login(LoginDto loginDto) {
        /*
            获取手机号和密码，做非空判断
               如果非空，开始校验：
                 根据手机号查询用户信息，如果不存在，登录失败。
                 如果存在，校验密码是否正确【如何校验？？】
                        获取用户输入的明文【123456】+ salt【盐】 ===> 按照相同的规则将明文和盐合在一起 ==>md5加密==>密文
                        将该密文和数据库存储的密文进行字符串比较
                    密码正确：生成登录成功的凭据
                    密码错误：登录失败
         */
        String phone = loginDto.getPhone();
        String rawPassword = loginDto.getPassword();//用户数据的明文 123456 ===> MD5 ===> 81e158e10201b6d7aee6e35eaf744796
        if(StringUtils.isNotEmpty(phone) && StringUtils.isNotEmpty(rawPassword)){
            ApUser apUser = apUserMapper.selectUserByPhone(phone);
            if(apUser==null){
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }
            String password = apUser.getPassword();//数据库的密文
            String salt = apUser.getSalt();//盐
            String miwen = MD5Utils.encodeWithSalt(rawPassword, salt);
            if(!miwen.equals(password)){
                //登录失败，密码错误
                return  ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }
            //登录成功，生成JWT令牌【载荷中存储了当前登录人的id】，返回给前端
            String token = AppJwtUtil.getToken(apUser.getId());
            Map map = new HashMap();
            map.put("token",token);
            apUser.setPassword("");
            apUser.setSalt("");
            map.put("user",apUser);
            return ResponseResult.okResult(map);
        }else {
            //游客身份登录
            String token = AppJwtUtil.getToken(0L);
            Map map = new HashMap();
            map.put("token",token);
            ApUser apUser = new ApUser();
            apUser.setId(0L);
            apUser.setName("游客");
            map.put("user",apUser);
            return ResponseResult.okResult(map);
        }
    }
}
